// 定义消息类型，限制只能是这四种
export type MessageType = "request" | "response" | "event" | "init";

// 所有消息都必须有的基础字段
export interface BaseMessage {
  id: string; // 唯一标识，用于匹配请求和响应
  type: MessageType; // 消息类型
  namespace: string; // 命名空间，防止不同应用的消息冲突
  timestamp: number; // 时间戳，用于调试和过期检查
}

// 请求消息：调用对方注册的方法
export interface RequestMessage extends BaseMessage {
  type: "request"; // 固定为 request 类型
  method: string; // 要调用的方法名
  params?: any; // 方法参数（可选）
}

// 响应消息：返回方法调用的结果
export interface ResponseMessage extends BaseMessage {
  type: "response"; // 固定为 response 类型
  result?: any; // 成功时的返回值（可选）
  error?: string; // 失败时的错误信息（可选）
}

// 事件消息：发送事件通知
export interface EventMessage extends BaseMessage {
  type: "event"; // 固定为 event 类型
  event: string; // 事件名称
  data?: any; // 事件数据（可选）
}

// 初始化消息：建立 MessageChannel 连接
export interface InitMessage extends BaseMessage {
  type: "init"; // 固定为 init 类型
  channelId: string; // 通道ID，用于标识这个连接
}

// 联合类型：所有消息类型的集合
export type BridgeMessage = RequestMessage | ResponseMessage | EventMessage | InitMessage;

// 待处理请求：存储等待响应的请求
export interface PendingRequest {
  resolve: (value: any) => void; // 成功时调用的函数
  reject: (error: Error) => void; // 失败时调用的函数
}

// 事件回调函数：处理收到的事件
export type EventCallback = (data?: any) => void;

// 方法处理器：处理收到的请求
export type MethodHandler = (params?: any) => any | Promise<any>;

// 桥接器配置选项
export interface BridgeOptions {
  namespace?: string; // 命名空间，默认为 "default"
  debug?: boolean; // 是否开启调试日志，默认为 false
  iframe?: HTMLIFrameElement; // iframe 元素，传入表示宿主页面，不传表示客户端页面
  // 安全配置
  security?: {
    strictOrigin?: boolean; // 是否严格验证源，默认为 true
    allowedOrigins?: string[]; // 允许的源列表，仅在 strictOrigin 为 false 时有效
  };
}
